<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.JS延迟加载的方式有哪些？（5）
        //script标签defer属性
        //脚本代码写在body标签之后

        // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；

        //ECMAScript ------ javascript的核心，规定了js的语法规范
        //DOM    文档对象模型(提供与网页内容交互的方法和接口)
        //BOM     浏览器对象模型(提供与浏览器交互的方法和接口)

        // 3.JavaScript 的数据类型有哪些？
        // 基本数据类型
        // String，Number，Boolean，Undefined，Null，Symbol
        // 引用数据类型
        // object array function

         // 4.如何进行数据类型的判断？（5）

        //1、typeof
        // 2、instance
        // 3、Object.prototype.toString.call(n1)
        //call/apply/bind

        // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）

        // undefined声明变量但是没有赋值，表无意义(空值)
        //声明变量未加以初始化就会返回undefeated值，表示空值

        // Null空值，空的对象，空的对象指针

        //声明变量没有赋值时或变量提升时的变量会得到 undefined

        // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）

        //  == 两者数值相同则返回true
        //  === 数值相同和数据类型也相同才会返回true

        // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）

        // break  终止整个循环（流程）
        // continue  跳出本次符合条件的循环，继续下次的循环

        // 8.如何判断字符串内是否包含指定字符？（5）

        // 使用indexOf()， lastIndexOf()，includes

        // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）

        //     会修改原数组
        //     splice(开始下标，截取长度，元素[可选])    获取数组规定范围之内的值
        //     reverse( )                  //翻转数组的元素顺序
        //     push()                      向数组末端添加数组成员，返回新数组的长度
        //     pop()                       向数组末端删除最后一个数组成员，返回被删除的数组成员
        //     unshift( )                   在数组头部添加任意个参数，返回该数组的长度
        //     shift()                      移除并且返回该数组的第一项
        //      sort

        // 不会修改原数组
        //     concat()                                连接(合并)两个或多个数组，并且返回合并之后的数组
        //     join()                                  将数组转换为字符串
        //     slice(开始下标，结束下标[不包含] )        截取数组里面的值
        //      indexOf()     
        //      lastIndexOf()

        // 10. var、let、const 区别？
        // 1、let、var、const都可以声明变量
        // 2、let不支持变量提升, var支持变量提升，const不允许对常量进行修改
        // 3、let不支持重复声明，var支持重复声明，const不支持重复声明
        // 4、let存在块级作用域，var不存在块级作用域，const存在块级作用域

        // 12. 如何在 DOM2 级事件绑定上传递参数？
        // addEventListener绑定事件，IE的DOM2级裹件通过attachEvent绑定事件；
        // 可以给某一个元素的同一行为绑定多个函数（方法），并且会分别执行

        // 13. 怎么阻止事件的进一步传播和默认事件？
//         使用event.stopPropagation()起到阻止捕获和冒泡阶段中当前事件的进一步传播。
        // 使用event.preventDefault()可以取消默认事件。

        // 14. 如何添加一个一次性事件？
        // addEventListener 的第三个参数使用 once 属性

        // 15. 同步和异步的区别?
//         "同步模式"就是后一个任务等待前一个任务结束，然后再执行，程序的执行顺序与任务的排列顺序是一致的、同步的。

//       "异步模式"则完全不同，每一个任务有一个或多个回调函数（callback），前一个任务结束后，不是执行后一个任务，而是执行回调函数，后一个任务则是不等前一个任务结束就执行，所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

        // 16. AJAX是什么？AJAX是如何为页面注入灵魂？
    //     ajax(阿贾克斯)
    //     执行异步网络请求,是一种创建动态网页技术
    // ajax作用
    //     是一种在无需刷新加载整个网页的情况下，能够更新部分网页内容的技术 

        // 17. 开发阶段的 AJAX 跨域有哪些解决方法，jsonp 的原理是什么
    //     后端解决跨域
    // (后端设置响应头，设置白名单)
    //     Access-Control-Allow-Origin:"指定的域名地址"l|*

    // 前端如何解决跨域
    // jsonp
    //     原理:利用script的src属性，不考虑跨域问题
    //     缺点:只能获取GET请求方式的数据
    //     (需要后台配合)

        // 18. 请描述一下cookies，sessionStorage和localStorage的区别
        // cookie用于存储web页面的用户信息
        // 特点:
        // 可以设置cookie过期时间
        // 限制大小为4kb左右，超出部分会被裁切

        // localStorage
        // 本地存储
        //     用于长久保留整个网页的数据，保存的数据没有过期时间，直到手动去除浏览器缓存
        // sessionStorage
        // 会话存储
        //     用于保存临时同一个窗口的数据，关闭窗口之后数据就会被删除

        // 19. 讲一下常见的异步场景，以及传统异步的诟病和解决方案
        // 场景：
        // 网络请求，如ajax图片加载
        // 定时任务，如setTimeout

        // 解决方案：
        // 回调函数
        // 事件触发
        // promise
        // generate

        // 20. 数组如何实现去重？请提供至少2种方法
        // 1、创建一个新的临时数组来保存数组中已有的元素
        // 2、使用indexof判断数组元素第一次出现的位置是否为当前位置
        // 3、先排序再去重

        // 21. 讲一下对基本数据类型 和 复杂/引用数据类型的理解？
//         基本数据类型数据存储发生在栈内存中；
        // 引用类型数据存储，分两步，在堆中保存数据，在栈中保存数据的地址(堆地址)；
        // 引用类型赋值，传递的是地址；基本类型赋值，传递的是值。

        // 22. this 的指向如何确定？
        // 谁调用它，this 就指向谁。
        // 1、普通函数（this指向window）默认绑定；严格模式下会抛出错误undefined（'use strict'）
        // 2、对象函数（this指向该方法所属对象）
        // 3、构造函数（如果没有return，则this指向这个对象实例；如果存在return返回一个对象，则this指向返回的这个对象）
        // 4、绑定事件函数（this指向的是函数的调用者，指向了接收事件的 HTML 元素）
        // 5、定时器函数（this指向window）

        // 23. 谈谈对垃圾回收机制的认识
        // （1）标记清除（Mark and sweep）
        // （2）引用计数（reference counting）

        // 24. 什么是回流重绘，如何进行优化？
        // 回流是布局或者几何属性需要改变就称为回流。回流是影响浏览器性能的关键因素，因为其变化涉及到部分页面（或是整个页面）的布局更新。一个元素的回流可能会导致了其所有子元素以及DOM中紧随其后的节点、祖先节点元素的随后的回流。

        // 由于节点的几何属性发生改变或者由于样式发生改变而不会影响布局的，称为重绘
        // 优化：
        // 1.避免频繁操作样式：一次性把需要修改的样式搞定
        // 2.避免频繁操作DOM：

        // 25. 请解释什么是事件代理
        // 事件代理的实现原理是利用冒泡和目标元素，把处理的事件添加到父元素，等待子元素事件的冒泡，并且可以通过父元素event.target判断哪个是子元素，从而做出处理

        // 26. 谈谈你对渐进增强和优雅降级的理解(补充)
        // 1.渐进增强(Progressive Enhancement):先针对低版本的浏览器进行构建页面，保证最基本的功能，然后在针对高级浏览器进行效果，交互等改进和追加功能达到更好的用户体验。

        //  2.优雅降级(Graceful Degradation):一开始就针对高版本的浏览器构建完整的功能，然后在针对低版本的浏览器进行兼容。
    </script>
</body>

</html>